csstransiton: Save finished state
authorTimm Bäder <mail@baedert.org>
Wed, 6 May 2020 09:37:51 +0000 (11:37 +0200)
committerTimm Bäder <mail@baedert.org>
Sun, 10 May 2020 06:44:20 +0000 (08:44 +0200)
Once a transtion is finished it can't change to unfinished again, so we
don't have to consult the progress tracker all the time.

gtk/gtkcsstransition.c
gtk/gtkcsstransitionprivate.h

index 23478b618b3032575998fa6c4364bcf3c3350354..62731a513d1b335bf18944be6549b64cb82b914b 100644 (file)
@@ -42,6 +42,7 @@ gtk_css_transition_advance (GtkStyleAnimation    *style_animation,
 
   gtk_progress_tracker_init_copy (&source->tracker, &transition->tracker);
   gtk_progress_tracker_advance_frame (&transition->tracker, timestamp);
+  transition->finished = gtk_progress_tracker_get_state (&transition->tracker) == GTK_PROGRESS_STATE_AFTER;
 
   return GTK_STYLE_ANIMATION (transition);
 }
@@ -55,8 +56,10 @@ gtk_css_transition_apply_values (GtkStyleAnimation   *style_animation,
   double progress;
   GtkProgressState state;
 
-  end = gtk_css_animated_style_get_intrinsic_value (style, transition->property);
+  if (transition->finished)
+    return;
 
+  end = gtk_css_animated_style_get_intrinsic_value (style, transition->property);
   state = gtk_progress_tracker_get_state (&transition->tracker);
 
   if (state == GTK_PROGRESS_STATE_BEFORE)
@@ -85,7 +88,7 @@ gtk_css_transition_is_finished (GtkStyleAnimation *animation)
 {
   GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
 
-  return gtk_progress_tracker_get_state (&transition->tracker) == GTK_PROGRESS_STATE_AFTER;
+  return transition->finished;
 }
 
 static gboolean
@@ -93,7 +96,7 @@ gtk_css_transition_is_static (GtkStyleAnimation *animation)
 {
   GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
 
-  return gtk_progress_tracker_get_state (&transition->tracker) == GTK_PROGRESS_STATE_AFTER;
+  return transition->finished;
 }
 
 static void
@@ -146,6 +149,7 @@ _gtk_css_transition_new (guint        property,
   transition->ease = _gtk_css_value_ref (ease);
   gtk_progress_tracker_start (&transition->tracker, duration_us, delay_us, 1.0);
   gtk_progress_tracker_advance_frame (&transition->tracker, timestamp);
+  transition->finished = gtk_progress_tracker_get_state (&transition->tracker) == GTK_PROGRESS_STATE_AFTER;
 
   return GTK_STYLE_ANIMATION (transition);
 }
index 822a8246d9e9a0ebf91d51e02a20edc44192a2d7..6f722023a17f2bcb817c39a46664e366652b951c 100644 (file)
@@ -43,6 +43,7 @@ struct _GtkCssTransition
   GtkCssValue        *start;
   GtkCssValue        *ease;
   GtkProgressTracker  tracker;
+  guint               finished;
 };
 
 struct _GtkCssTransitionClass